package epul.bdav;


import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlIDREF;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author ecoquery
 */
@Entity
public class Livre {
    /**
     * Spécifie la clé primaire de l'entité
     */
    @Id
    /**
     * Spécifie la stratégie d'attribution de clé primaire de l'entité
     * Ici la génération est de type SEQUENCE dont le nom est "LIVRE_GEN"
     */
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "LIVRE_GEN")
    /**
     * Le générateur de clé primaire spécifié avec GeneratedValue
     * La portée du nom de generateur est globale à tout type de generateur dans persistence
     * Ici le nom de la séquence est "livre_seq"
     */
    @SequenceGenerator(name = "LIVRE_GEN", sequenceName = "livre_seq2", allocationSize=1)
    @XmlAttribute // l'id sera transformé en String
    private int id;
    /**
     * Utilisé pour spécifier une colonne propre à l'entité
     */
    @Column(name="titre")
    @XmlElement(name="titre")
    private String titre;
    /**
     * Plusieurs livres peuvent être edité par un editeur
     */
    @ManyToOne
     /**
     * Spécifie une colonne (dépendante d'une autre entité (clé étrangère))
     */
    @JoinColumn(name = "editeur")
    @XmlIDREF
    @XmlAttribute
    private Membre editeur;

    @OneToMany(mappedBy="partie")
    @XmlElement(name = "partie")
    private Collection<Partie> parties = new ArrayList<Partie>();

    // Ajouté pour gérer les identifiants hors des ORMs
    public void setId(int id) {
        this.id = id;
    }

    @XmlTransient
    public int getId() {
        return id;
    }

    @XmlTransient
    public String getTitre() {
        return titre;
    }

    public void setTitre(String titre) {
        this.titre = titre;
    }
    
    @XmlTransient
    public Membre getEditeur() {
        return editeur;
    }

    public void setEditeur(Membre editeur) {
        if(this.editeur!=null)
            this.editeur.getLivres().remove(this);

        if(editeur!=null)
            editeur.getLivres().add(this);

        this.editeur=editeur;
    }

     @XmlTransient
    public Collection<Partie> getParties() {
        return parties;
    }

    public void setParties(Collection<Partie> parties) {
        this.parties = parties;
    }

    void addPartie(Partie p) {
        parties.add(p);
    }
    
}